/*******************************************************************************
* Имя файла: typeConversion.cpp
* Дата: 31-03-2024
* Разработчик: Андрей Подлегаев
* Группа: 315
* Факультет: ЦДО ТУСУР
* Лицензия: BSD
* Описание: Решение задач к лабораторной работе №4 (ЦДО ТУСУР)
* *****************************************************************************/


#include "typeConversion.h"

/* Функция преобразования типов */
void typeConversion()
{
  std::cout << "Задание № 1 к лабораторной работе № 4 \n\n";
  std::cout << "Введите значение переменной x (тип int) в диапазоне от "
            << std::numeric_limits<int>::min() << " до "
            << std::numeric_limits<int>::max() << "\n";

  int x;
  std::cout << "> ";
  std::cin >> x;
  std::cout << "Введите значение переменной y (тип float) в диапазоне от "
            << std::numeric_limits<float>::min() << " до "
            << std::numeric_limits<float>::max() << "\n";

  float y;
  std::cout << "> ";
  std::cin >> y;
  std::cout << "Введите значение переменной z (тип double) в диапазоне от "
            << std::numeric_limits<double>::min() << " до "
            << std::numeric_limits<double>::max() << "\n";

  double z;
  std::cout << "> ";
  std::cin >> z;
  std::cout << "Введите значение переменной k (тип unsigned short) в диапазоне от "
            << std::numeric_limits<unsigned short>::min() << " до "
            << std::numeric_limits<unsigned short>::max() << "\n";

  std::cout << "> ";
  unsigned short k;
  std::cin >> k;

  int i;
  i = (int(x) + int(y) * int(z) + int(k));
  std::cout << "Преобразование типов выполнено С-style cast.\n";
  std::cout << "Результат вычисления выражения int i = (x+y)*z+k равен: " << i << "\n";

  i = (static_cast<int>(x) + static_cast<int>(y) * static_cast<int>(z) + static_cast<int>(k));
  std::cout << "Преобразование типов выполнено static_cast.\n";
  std::cout << "Результат вычисления выражения int i = (x+y)*z+k равен: " << i << "\n";

  i = x + y * z + k;
  std::cout << "Преобразование типов выполнено неявно.\n";
  std::cout << "Результат вычисления выражения int i = (x+y)*z+k равен: " << i << "\n";
  std::cout << "В первых двух расчётах результат верен. При неявном преобразовании типов ошибка в вычислениях.\n";
  std::cout << "Не рекомендуется смешивать знаковые и беззнаковые типы.\n\n";

  unsigned short a;
  a = short(x) - short(y) / short(z);
  std::cout << "Преобразование типов выполнено С-style cast.\n";
  std::cout << "Результат вычисления выражения k = x-y/z равен: " << a << "\n";

  a = static_cast<unsigned short>(x) - static_cast<unsigned short>(y)/static_cast<unsigned short>(z);
  std::cout << "Преобразование типов выполнено static_cast.\n";
  std::cout << "Результат вычисления выражения k = x-y/z равен: " << a << "\n";

  a = x - y / z;
  std::cout << "Преобразование типов выполнено неявно.\n";
  std::cout << "Результат вычисления выражения k = x-y/z равен: " << a << "\n";
  std::cout << "Как, только результат превысит размер типа unsigned short, произойдет переполнение.\n";
  std::cout << "В данном слуячае важно контролировать величину значений.\n";
  std::cout << "Не рекомендуется смешивать знаковые и беззнаковые типы.\n\n";

  double b;
  b = double(x) * double(y) + z / double(x);
  std::cout << "Преобразование типов выполнено С-style cast.\n";
  std::cout << "Результат вычисления выражения z = x*y+z/x равен: " << b << "\n";

  b = static_cast<double>(x) * static_cast<double>(y) + z / static_cast<double>(x);
  std::cout << "Преобразование типов выполнено static_cast.\n";
  std::cout << "Результат вычисления выражения z = x*y+z/x равен: " << b << "\n";

  b = x * y + z / x;
  std::cout << "Преобразование типов выполнено неявно.\n";
  std::cout << "Результат вычисления выражения z = x*y+z/x равен: " << b << "\n";
  std::cout << "Работоспособный вариант.\n";
  std::cout << "Не рекомендуется смешивать знаковые и беззнаковые типы.\n\n";

  unsigned int ui;
  ui = int(x) / int(y) + int(k);
  std::cout << "Преобразование типов выполнено С-style cast.\n";
  std::cout << "Результат вычисления выражения unsigned int ui = x/y+k равен: " << ui << "\n";

  ui = static_cast<int>(x) / static_cast<int>(y) + static_cast<int>(k);
  std::cout << "Преобразование типов выполнено static_cast.\n";
  std::cout << "Результат вычисления выражения unsigned int ui = x/y+k равен: " << ui << "\n";

  ui = x / y + k;
  std::cout << "Преобразование типов выполнено неявно.\n";
  std::cout << "Результат вычисления выражения unsigned int ui = x/y+k равен: " << ui << "\n";
  std::cout << "Последнее вычисление с ошибкой.\n";
  std::cout << "Не рекомендуется смешивать знаковые и беззнаковые типы.\n\n";

 short s;
  s = short(x) % (short(x) / short(y));
  std::cout << "Преобразование типов выполнено С-style cast.\n";
  std::cout << "Результат вычисления выражения short s = x%(x/y) равен: " << s << "\n";

  s = static_cast<short>(x) % (static_cast<short>(x) /static_cast<short>(y));
  std::cout << "Преобразование типов выполнено static_cast.\n";
  std::cout << "Результат вычисления выражения short s = x%(x/y) равен: " << s << "\n";

  //s = x % (x / y);
  std::cout << "Преобразование типов выполнено неявно.\n";
  std::cout << "Результат вычисления выражения unsigned short s = x%(x/y) равен: " << s << "\n";
  std::cout << "Последнее вычисление с ошибкой.\n";
  std::cout << "Не рекомендуется смешивать знаковые и беззнаковые типы.\n\n";
}
